Skip to content

🤖 fix: stabilize streaming transcript seams#3201

Merged
ammario merged 31 commits intomainfrom
chat-transcript-08jf
Apr 30, 2026
Merged

🤖 fix: stabilize streaming transcript seams#3201
ammario merged 31 commits intomainfrom
chat-transcript-08jf

Conversation

@ammar-agent
Copy link
Copy Markdown
Collaborator

@ammar-agent ammar-agent commented Apr 27, 2026

Summary

Stabilizes the chat transcript bottom seam during streaming, hydration, workspace switches, idle chat opens, active compaction, and chats with expanded tool panes — and removes the noticeable delay before the latest streaming bash row expands when a chat is opened.

Background

Earlier rewrites already replaced the old multi-path auto-scroll patchwork with a small bottom-lock state machine. The remaining bugs were:

  1. The bottom-lock could still drift slightly above the real maximum when expanded tool panes (last bash row, etc.) re-laid out after a chat switch. Browser/scroll-anchor settling, async highlight, mermaid render, and CSS transitions all produce layout changes that don't always fire ResizeObserver in time for the next paint.
  2. When a chat is opened with the latest bash already streaming, the row stayed collapsed for 300 ms before auto-expanding. That delay was a flash-prevention trick for fast-completing in-chat commands — it should not apply to chat-open, where the bash has clearly already outlived 300 ms.

Implementation

  • useAutoScroll enforces the bottom-lock invariant in a requestAnimationFrame loop instead of relying solely on observer delivery. While autoScroll is on, every frame writes scrollTop = scrollHeight - clientHeight (no-op when already there). This makes the lock independent of any single layout signal source, so async settling inside expanded tool panes can no longer leave the transcript a few pixels above the bottom.
  • Scroll intent is classified by input semantics: wheel/touch and scrollport scrollbar drags release the lock; content clicks (e.g., expanding the last bash row) do not.
  • BashToolCall extracts auto-expand into useBashAutoExpand. On the first effect run after mount, if the bash is already the latest streaming bash, the row expands synchronously in a layout effect — no perceptible delay on chat-open. New in-chat bash transitions still get the 300 ms flash protection.
  • LayoutStackLane remains reservation/alignment-only; transcript scroll anchoring is still disabled inside bottom-lock and re-enabled in manual reading mode so users reviewing older messages keep their viewport stable when async highlights settle.

Validation

  • bun test src/browser/hooks/useAutoScroll.test.tsx
  • bun test src/browser/features/Tools/Shared/useBashAutoExpand.test.tsx
  • TEST_INTEGRATION=1 bun x jest tests/ui/chat/bottomLayoutShift.test.ts --runInBand
  • make static-check
  • make test

Risks

Transcript scrolling is sensitive to browser timing. The frame-aligned approach trades a small per-frame layout read while bottom-locked for stronger correctness guarantees. The auto-expand split keeps the existing flash-prevention behavior for in-chat bashes; only chat-open is changed to expand synchronously before paint.


Generated with mux • Model: anthropic:claude-opus-4-7 • Thinking: max • Cost: $323.49

@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Updated to fix CI/unit isolation from the MarkdownComponents highlight regression test and hardened frontend base-path initialization against incomplete DOM shims.

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Chef's kiss.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Updated the E2E reasoning-flow expectation to match the new stabilized behavior: reasoning displaced by follow-on answer text remains expanded instead of rendering an ellipsis toggle.

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Can't wait for the next one!

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Updated the PR to restore chat-open bottom pinning after the earlier transcript stabilization changes. Local validation is green:

  • bun test src/browser/hooks/useAutoScroll.test.tsx src/browser/components/ChatPane/LayoutStackLane.test.tsx
  • TEST_INTEGRATION=1 bun x jest tests/ui/chat/bottomLayoutShift.test.ts --runInBand
  • make static-check

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Re-requesting after the active-compaction chat-open bottom-pin fix.

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🎉

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Re-requesting after replacing the auto-scroll patchwork with the bottom-lock rewrite and adding the idle-chat switch regression.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0b1e4a2142

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/browser/hooks/useAutoScroll.ts
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Addressed the inertial bottom re-lock feedback and resolved the thread.

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. You're on a roll.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Re-requesting after the expanded bash/tool bottom-lock follow-up.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8b31f95d29

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/browser/features/Tools/BashToolCall.tsx Outdated
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Addressed the completed-bash regression by limiting nested bash output pinning to live output only, and fixed the broader expanded-row bottom drift by treating transcript content clicks as layout interactions rather than scroll intent. Targeted scroll tests and make static-check pass locally.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 01785aa679

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/browser/components/ChatPane/ChatPane.tsx Outdated
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Addressed the anchoring feedback by restoring overflow-anchor: none to bottom-lock mode only. Manual reading mode now keeps browser anchoring enabled, while expanded-row clicks keep the lock active so the original bottom drift remains covered. Targeted tests, make static-check, and make test pass locally.

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Two updates: (1) useAutoScroll now enforces the bottom-lock invariant in a requestAnimationFrame loop so async layout inside expanded tool panes (CSS transitions, Shiki/Mermaid settle, scroll-anchor races) cannot leave the transcript a few pixels above the real bottom. (2) BashToolCall's auto-expand was extracted into useBashAutoExpand, which expands the latest streaming bash synchronously on chat-open via useLayoutEffect — the 300 ms flash-prevention delay only applies to new in-chat bash transitions where it's actually meaningful. Targeted tests, the full UI integration test, make static-check, and make test all pass locally.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a68652491d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/browser/hooks/useAutoScroll.ts Outdated
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Addressed the perf concern: the rAF loop now only runs while bottom-lock is held. When the user scrolls up and autoScroll becomes false, the effect tears down and stops scheduling. Returning to the bottom (manual scroll, jump-to-bottom, send) restarts the loop. Added a regression test that asserts the loop is gated on lock state. Targeted tests + make static-check pass locally.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 86df5ed2bc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/browser/hooks/useAutoScroll.ts Outdated
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Addressed the keyboard guard: scroll keys (PageUp/PageDown/Home/End/Arrows/Space) now mark scroll intent regardless of which transcript descendant has focus, since the browser scrolls the scrollport in those cases anyway. Added regression tests covering both focused-descendant scroll keys and non-scroll keys (which must remain inert). Targeted tests + UI integration tests + make static-check pass locally.

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Keep them coming!

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ammar-agent ammar-agent force-pushed the chat-transcript-08jf branch from 58176b5 to ec281aa Compare April 29, 2026 18:47
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

I pushed a test-isolation fix for the unit flake: the new hook tests now use the shared installDom() cleanup helper, and sendOptions.test no longer leaves CustomEvent/DOM globals undefined for downstream renderer tests.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bd020ebb2a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/browser/hooks/useAutoScroll.ts Outdated
Comment thread src/browser/features/Messages/MessageWindow.test.tsx Outdated
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

I pushed a follow-up for the integration flake: the idle-chat bottom layout test now re-queries the active scrollport after workspace switch before applying mocked metrics, so it no longer depends on whether happy-dom/React preserved or replaced the scrollport node on CI.

@ammar-agent ammar-agent force-pushed the chat-transcript-08jf branch from 071a867 to 3b42700 Compare April 29, 2026 21:43
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Rebased onto latest origin/main, resolved conflicts, and re-ran focused unit coverage, the bottom layout integration test, and make static-check successfully.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3b42700760

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/browser/components/ChatPane/LayoutStackLane.tsx Outdated
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

I pushed a focused unit-flake hardening pass: Button/Switch tests now bootstrap Radix with the shared DOM helper, and the inline skill rendering test waits for Streamdown's rendered badge output before asserting. Local failing subset and make static-check are green.

@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Addressed the LayoutStackLane observer mount case by including hasItems in the setup effect dependencies and adding coverage for an empty null lane that later mounts items. Local layout-stack, CI-failing unit subset, bottom-layout integration, and static checks are green.

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Swish!

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

I pushed another targeted unit hardening: Button/Switch tests no longer assert Radix's transient data-state implementation detail (which depends on suite-wide module-eval order), and inline skill assertions use a longer wait for Streamdown output under full coverage.

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Delightful!

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

I pushed a targeted fix for the remaining unit flake: the UserMessageContent composition test no longer waits on Streamdown's asynchronous Markdown badge rendering (covered directly by InlineSkillMarkdown.test) and now asserts only the synchronous slash badge/edit-mode behavior. Local coverage subset and static-check are green.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b3d6d2469b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/browser/features/Tools/Shared/useBashAutoExpand.ts
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Addressed the bash auto-expand feedback: fresh executing mounts now still take the 300ms debounce unless the tool timestamp shows the bash has already outlived the flash window. Local bash-autoexpand, flaky unit subset, bottom-layout integration, and static checks are green.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5049110663

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/browser/hooks/useAutoScroll.ts
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Addressed the content-click scroll intent feedback: plain mousedown no longer marks scroll intent, drag/selection marks on mousemove with primary button, and scrollbar/wheel/touch/key behavior remains user-owned. Local autoscroll, bash-autoexpand, flaky unit subset, bottom-layout integration, and static checks are green.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ae415c1aa3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/browser/hooks/useAutoScroll.ts Outdated
@ammar-agent
Copy link
Copy Markdown
Collaborator Author

@codex review

Addressed the editable-control scroll-key feedback: scroll keys on transcript text inputs/textareas/contenteditable targets no longer open a transcript scroll-intent window, while non-editable descendant scroll keys still release bottom lock. Local autoscroll, bash-autoexpand, flaky unit subset, bottom-layout integration, and static checks are green.

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ammario ammario merged commit 2b735e0 into main Apr 30, 2026
24 checks passed
@ammario ammario deleted the chat-transcript-08jf branch April 30, 2026 04:58
ammar-agent added a commit that referenced this pull request Apr 30, 2026
Reduce maintenance overhead in the chat transcript bottom-lock and bash auto-expand paths after PR #3201.

---

_Generated with `mux` • Model: `openai:gpt-5.5` • Thinking: `xhigh` • Cost: `86.28`_

<!-- mux-attribution: model=openai:gpt-5.5 thinking=xhigh costs=386.28 -->
ammario pushed a commit that referenced this pull request Apr 30, 2026
## Summary

Follow-up cleanup after #3201: trims maintenance-only code in the chat
transcript bottom-lock and bash auto-expand paths while preserving the
validated behavior. After a 4-lane sub-agent review, this PR also
consolidates duplicated scroll-metric test scaffolding and removes a few
small dead/indirect code paths.

## Background

#3201 stabilized transcript bottom ownership and bash row expansion.
This PR keeps that behavior but reduces surface area in the related code
paths. Cleanup candidates were split across sub-agent lanes for
auto-scroll, bash/tool rows, ChatPane/LayoutStack, and related renderer
test helpers; the accepted low-risk findings were consolidated here.

## Implementation

- Replaces the bash auto-expand hook's raw latest-bash id input with a
direct `hasReplacementStreamingBash` boolean.
- Consolidates bash auto-expand timer cleanup into the layout effect and
removes the separate unmount-only effect.
- Simplifies local Bash row derived state for output/background results.
- Removes the unused `observedHeightRef` writes from `LayoutStackLane`.
- Drops an unused auto-scroll distance helper.
- Removes dead `todoCount` prop plumbing from `ChatInputPane`.
- Shares the happy-dom scroll-metric shim between hook and integration
tests.
- Reuses the scroll-metric helper in the bottom-layout integration test
and makes the viewport-resize case actually shrink the viewport.

## Validation

- `make fmt`
- `bun test src/browser/hooks/useAutoScroll.test.tsx`
- `bun test
src/browser/features/Tools/Shared/useBashAutoExpand.test.tsx`
- `bun test src/browser/components/ChatPane/LayoutStackLane.test.tsx`
- `TEST_INTEGRATION=1 bun x jest tests/ui/chat/bottomLayoutShift.test.ts
--runInBand --silent`
- `make static-check`

## Risks

Low. The production changes are small refactors in already-covered
paths. The most behavior-adjacent changes are the bash auto-expand hook
API and shared test scroll shim, both covered by targeted tests plus
`make static-check`.

---

_Generated with `mux` • Model: `openai:gpt-5.5` • Thinking: `xhigh` •
Cost: `$386.28`_

<!-- mux-attribution: model=openai:gpt-5.5 thinking=xhigh costs=386.28
-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants